package com.woniuxy.commons;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String methodName = req.getParameter("method");
        //没有传递method参数或method值为空字符串，则抛出异常
        if (null == methodName||"".equals(methodName.trim())  ) {
            throw new RuntimeException("当前请求中未提供method参数，无法调用到对应的方法！");
        }

        //基于用户传递的method参数，去生成子类的对应方法名的方法对象
        Method method = null;
        try {
            method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        if (null != method) {
            try {
                Object returnValue = method.invoke(this, req, resp);
                //如果方法返回值为空，表示不需要进行跳转（重定向或请求转发）
                if (null == returnValue) {
                    return;
                }else{
                    String value= (String) returnValue;
                    if (value.contains(":")) {
                        String[] strs = value.split(":");
                        String option=strs[0];//获取了要执行的操作（r:重定向，f:请求转发）
                        String path=strs[1];//获取跳转路径

                        if (option.equals("r")) {
                            resp.sendRedirect(path);
                        } else if (option.equals("f")) {
                            req.getRequestDispatcher(path).forward(req,resp);
                        }else{
                            throw new RuntimeException("当前操作方式不被允许！");
                        }
                    }else{
                        //没有指定操作方式时，指定默认的操作
                        req.getRequestDispatcher(value).forward(req,resp);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else{
            throw new RuntimeException("当前方法不存在！");
        }

    }
}
